home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / checkbox / scripts / compiz-check < prev    next >
Text File  |  2009-11-05  |  28KB  |  969 lines

  1. #!/bin/bash
  2. # Compiz-Check -- script to test if your system is able to run Compiz
  3. #
  4. # Copyright (c) 2008 Nick Bauermeister <Forlong@gmx.de>
  5. #
  6. # This program is free software. Feel free to redistribute and/or
  7. # modify it under the terms of the GNU General Public License v3
  8. # as published by the Free Software Foundation.
  9. #
  10. # This program is distributed in the hope that it will be useful
  11. # but comes WITHOUT ANY WARRANTY; without even the implied warranty
  12. # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  13. # See the GNU General Public License for more details.
  14.  
  15. VERSION="0.4.5-4"
  16.  
  17. usage()
  18. {
  19.   printf "\nAbout:\n"
  20.   printf "%6s Compiz-Check will check if your system satisfies all requirements to\n"
  21.   printf "%6s run Compiz properly.\n"
  22.   printf "%6s It will also help you trace back the problem(s) you may be facing.\n\n"
  23.   printf "%6s Visit\033[1m http://forlong.blogage.de/article/pages/Compiz-Check \033[0m\n"
  24.   printf "%6s for further information.\n\n"
  25.   printf "Usage:\n"
  26.   printf "%6s Run this script without any arguments.\n\n"
  27.   printf "Available arguments:\n"
  28.   printf "  -h  or --help %8s List available arguments and usage (this message).\n"
  29.   printf "  -v  or --version %5s Print version of Compiz-Check in use.\n\n"
  30. }
  31.  
  32. banana()
  33. {
  34.   printf "//\\ \nV%2s\\ \n \\%2s\\ \n%2s\\ \033[1;33m.\`-.\n%3s|\\ \`. \`.\n%3s( \\%2s\`. \`-.%24s_,.-:\\ \n%4s\\ \\%3s\`.%2s\`-._%13s__..--' ,-';/\n%5s\\ \`.%3s\`-.%3s\`-..___..---'%3s_.--' ,'/\n%6s\`. \`.%4s\`-._%8s__..--'%4s,' /\n%8s\`. \`-_%4s \`\`--..''%6s _.-' ,'\n%10s\`-_ \`-.___%8s__,--'%3s,'\n%13s\`-.__%2s\`----'''%4s__.-'\n%18s\`--..____..--'\033[0m\n\n"
  35. }
  36.  
  37. if [ $# != 0 ]; then
  38.   case $1 in
  39.     -h | --help)
  40.       usage
  41.       exit 0
  42.       ;;
  43.     -v | --version)
  44.       echo $VERSION
  45.       exit 0
  46.       ;;
  47.     --banana)
  48.       banana
  49.       exit 0
  50.       ;;
  51.     *)
  52.       printf "Error, unknown option: \"$1\"\nRun \033[1m$0 --help\033[0m for details.\n"
  53.       exit 1
  54.       ;;
  55.   esac
  56. fi
  57.  
  58. # Exit when running as root
  59. if [ "$(whoami)" = root ]; then
  60.   printf "\n Do not run this script as root, because it might distort its outcome.\n Aborting.\n\n"
  61.   exit 1
  62. fi
  63.  
  64. # Needed for lspci, because it's not in the $PATH of every distro
  65. export PATH=$PATH:/sbin:/usr/sbin
  66.  
  67. # Can't handle more than one graphics card or X server at a time
  68. if [ $(lspci | grep VGA -c) -gt 1 ]; then
  69.   ERROR_DEVICE="graphics chip"
  70. elif [ $(xdpyinfo | grep -i dimensions: -c) -gt 1 ]; then
  71.   ERROR_DEVICE="running X server"
  72. fi
  73.  
  74. if [ ! -z "$ERROR_DEVICE" ]; then
  75.   printf "\n More than one $ERROR_DEVICE detected -- sorry, the script can not handle that.\n Aborting.\n\n"
  76.   exit 1
  77. fi
  78.  
  79. # Skip system checks if they are harmful or useless
  80. SKIP=yes
  81.  
  82. # Coloured output (there are other emphases hardcoded in the script, so
  83. # it would  be pretty useless changing those here)
  84. UNKNOWN="\033[1;31mUnknown\033[0m"
  85. OK=" \033[1;32mOK\033[0m "
  86. FAIL="\033[1;31mFAIL\033[0m"
  87. SKIPPING="\033[33mSKIP\033[0m"
  88. WARN="\033[33mWARN\033[0m"
  89.  
  90. # General distribution info file
  91. DIST_INFO="/etc/lsb-release"
  92.  
  93. # Detect distribution
  94. # If your distro is not on this list, contact me.
  95. detect_distro()
  96. {
  97.   if [ -d /etc/linuxmint ]; then
  98.     DISTRIB_ID="Linux Mint"
  99.     return 0
  100.   elif [ -r $DIST_INFO ]; then
  101.     . $DIST_INFO
  102.   fi
  103.     
  104.   if [ -z $DISTRIB_ID ]; then
  105.     unset DISTRIB_RELEASE
  106.     if [ -f /etc/arch-release ]; then
  107.       DISTRIB_ID="Arch Linux"
  108.     elif [ -r /etc/knoppix-version ]; then
  109.       DISTRIB_ID="Knoppix"
  110.       DISTRIB_RELEASE="($(cat /etc/knoppix_version))"
  111.     elif [ -r /etc/sidux-version ]; then
  112.       DISTRIB_ID="Sidux"
  113.       DISTRIB_RELEASE="($(cat /etc/sidux-version | awk '{print $4}'))"
  114.     elif [ -r /etc/debian_version ]; then
  115.       DISTRIB_ID="Debian GNU/Linux"
  116.       DISTRIB_RELEASE="($(cat /etc/debian_version))"
  117.     elif [ -r /etc/fedora-release ]; then
  118.       DISTRIB_ID="$(cat /etc/redhat-release)"
  119.     elif [ -r /etc/gentoo-release ]; then
  120.       DISTRIB_ID="Gentoo"
  121.       DISTRIB_RELEASE="($(cat /etc/gentoo-release | awk '{print $5}'))"
  122.     elif [ -f /etc/lfs-version ]; then
  123.       DISTRIB_ID="Linux from scratch"
  124.     elif [ -r /etc/pclinuxos-release ]; then
  125.       DISTRIB_ID="PCLinuxOS"
  126.     elif [ -f /etc/mandriva-release ] || [ -f /etc/mandrake-release ]; then
  127.       DISTRIB_ID="Mandriva"
  128.     elif [ -f /etc/redhat-release ]; then
  129.       DISTRIB_ID="RedHat"
  130.     elif [ -r /etc/vector-version ]; then
  131.       DISTRIB_ID="VectorLinux"
  132.       DISTRIB_RELEASE="($(cat /etc/vector-version))"
  133.     elif [ -r /etc/slackware-version ]; then
  134.       DISTRIB_ID="$(cat /etc/slackware-version)"
  135.     elif [ -f /etc/release ]; then
  136.       DISTRIB_ID="Solaris"
  137.     elif [ -r /etc/SuSE-release ]; then
  138.       DISTRIB_ID="$(grep -i suse /etc/SuSE-release)"
  139.     elif [ -f /etc/yellowdog-release ]; then
  140.       DISTRIB_ID="YellowDog Linux"
  141.     elif [ -f /etc/zenwalk-version  ]; then
  142.       DISTRIB_ID="Zenwalk"
  143.     else
  144.       DISTRIB_ID="Unknown"
  145.     fi
  146.   fi
  147. }
  148.  
  149. # Detect desktop environment in use
  150. detect_de()
  151. {
  152.   if [ ! -z $GNOME_DESKTOP_SESSION_ID ]; then
  153.     DE=GNOME
  154.   elif [ "$KDE_SESSION_VERSION" = 4 ]; then
  155.     DE=KDE4
  156.   elif [ "$KDE_FULL_SESSION" = true ]; then
  157.     DE=KDE
  158.   elif xprop -root _DT_SAVE_MODE | grep ' = \"xfce4\"$' >/dev/null 2>&1 ; then
  159.     DE=Xfce
  160.   else
  161.     DE=Unknown
  162.   fi
  163. }
  164.  
  165. # Detect graphics card
  166. detect_video()
  167. {
  168.   if lspci | grep -q VGA ; then
  169.     VIDEO=$(lspci | grep VGA | sed 's/.*: //')
  170.   else
  171.     VIDEO=$UNKNOWN # TODO abort?
  172.   fi
  173. }
  174.  
  175. XSET=$(command -v xset)
  176.  
  177. # Detect location of the Xorg log file
  178. if [ ! -z $XSET ]; then
  179.   XORG_LOG=$($XSET q | grep "Log file" | awk '{print $3}')
  180. fi
  181.  
  182. # Fallback Xorg log
  183. if [ -z $XORG_LOG ]; then
  184.   if [ -f /var/log/Xorg.0.log ]; then
  185.     XORG_LOG=/var/log/Xorg.0.log
  186.   fi
  187. fi
  188.  
  189. # advise to look for proprietary drivers in Ubuntu
  190. detect_driver_manager()
  191. {
  192.   if [ $(echo "$DISTRIB_RELEASE" | sed 's/\.//g') -gt 710 ] && [ $DE = GNOME ] || [ $DE = Xfce ]; then
  193.     DRVS_MNGR=hardy-gtk
  194.   elif [ $(echo "$DISTRIB_RELEASE" | sed 's/\.//g') -gt 710 ] && [ $DE = KDE ]; then
  195.     DRVS_MNGR=hardy-kde
  196.   elif [ "$DISTRIB_RELEASE" = "7.10" ] && [ $DE = GNOME ] || [ $DE = Xfce ]; then
  197.     DRVS_MNGR=gutsy-gtk
  198.   elif [ "$DISTRIB_RELEASE" = "7.10" ] && [ $DE = KDE ]; then
  199.     DRVS_MNGR=gutsy-kde
  200.   elif [ "$DISTRIB_RELEASE" = "7.04" ] && [ $DE = GNOME ] || [ $DE = Xfce ]; then
  201.     DRVS_MNGR=feisty-gtk
  202.   fi
  203. }
  204.  
  205. # Drivers known to work with Compiz
  206. WHITELIST="nvidia intel i810 ati radeon fglrx"
  207.  
  208. # Drivers taken from Hardy's /usr/lib/xorg/modules/drivers/ directory
  209. # plus radeonhd, vboxvideo, nouveau and the proprietary one's.
  210. # Contact me, if your driver is not on this list.
  211. KNOWN_DRIVERS="$WHITELIST apm ark chips cirrus cyrix fbdev glint i128
  212.                i740 imstt mga mtx neomagic newport nsc nv openchrome
  213.                rendition s3virge savage siliconmotion sis sisusb tdfx
  214.                tga trident tseng vesa vga via vmware vboxvideo voodoo
  215.                radeonhd s3 nouveau"
  216.  
  217. # Detect driver in use.
  218. # TODO not really satisfied with this. Just because the module is
  219. # loaded doesn't necessarily mean the driver is properly working.
  220. detect_driver()
  221. {
  222.   if [ -z $XORG_LOG ]; then
  223.     DRV=$SKIPPING
  224.     CHECKS=$SKIP
  225.     SKIP_MESSAGE="Unable to locate your Xorg log"
  226.     return 1
  227.   elif [ ! -r $XORG_LOG ]; then
  228.     DRV=$SKIPPING
  229.     CHECKS=$SKIP
  230.     SKIP_MESSAGE="No permission to read $XORG_LOG"
  231.     return 1
  232.   fi
  233.  
  234.   for i in $KNOWN_DRIVERS ; do
  235.     if grep Loading $XORG_LOG | grep -q "${i}_drv\.so" &&
  236.        ! grep Unloading $XORG_LOG | grep -q "${i}_drv\.so" ; then
  237.       DRV=$i
  238.     fi
  239.   done
  240.  
  241.   if [ -z $DRV ]; then
  242.     DRV=$UNKNOWN
  243.     return 0
  244.   fi
  245.  
  246. # glxinfo might kill X if vesa or vga are in use (LP#119341)
  247. # 'LIBGL_ALWAYS_INDIRECT=1 glxinfo' kills X on openchrome driver
  248. # according to user feedback (same for unichrome)
  249. # nv driver blocks AIGLX
  250.   case $DRV in
  251.     vesa | vga | nv)
  252.       CHECKS=$SKIP
  253.       SKIP_MESSAGE="$DRV driver in use"
  254.       ERROR_MESSAGE="The $DRV driver is not capable of running Compiz, you need to install\n the proper driver for your graphics card."
  255.       if [ "$DISTRIB_ID" = Ubuntu ]; then
  256.         detect_driver_manager
  257.       fi
  258.       ;;
  259.     unichrome | openchrome)
  260.       CHECKS=$SKIP
  261.       SKIP_MESSAGE="$DRV driver in use" #TODO ERROR_MESSAGE
  262.       ;;
  263.   esac
  264. }
  265.  
  266. # Detect rendering method
  267. detect_rendering()
  268. {
  269.   XVINFO=$(command -v xvinfo)
  270.  
  271.   if [ ! -z $XVINFO ]; then
  272.     if $XVINFO | grep -q Xgl ; then
  273.       RENDER=Xgl
  274.       return 0
  275.     fi
  276.   fi    
  277.  
  278.   if xdpyinfo | grep -q NV-GLX ; then
  279.     RENDER=Nvidia
  280.     return 0
  281.   fi
  282.  
  283.   AIGLX_STAT="AIGLX enabled\|AIGLX disabled"
  284.  
  285.   if [ -z $XORG_LOG ] || [ ! -r $XORG_LOG ]; then
  286.     RENDER=$SKIPPING
  287.     return 1
  288.   elif grep "$AIGLX_STAT" $XORG_LOG | tail -1 | grep -q "AIGLX enabled" ; then
  289.     RENDER=AIGLX
  290.     return 0
  291.   fi
  292.  
  293.   if [ -z $XVINFO ]; then
  294.     RENDER=$SKIPPING
  295.     CHECKS=$SKIP
  296.     SKIP_MESSAGE="Unable to check for Xgl, could not run xvinfo"
  297.   else
  298.     RENDER="\033[31mNone\033[0m"
  299.     CHECKS=$SKIP # Checks can be OK nonetheless
  300.     SKIP_MESSAGE="No rendering method in use (AIGLX, Xgl or Nvidia)"
  301.   fi
  302. }
  303.  
  304. GLXINFO=$(command -v glxinfo)
  305.  
  306. # Check for texture_from_pixmap
  307. check_tfp()
  308. {
  309.   if [ "$RENDER" = Xgl ]; then
  310.     TFP=$SKIPPING
  311.     return 0
  312.   elif [ -z $GLXINFO ]; then
  313.     TFP=$SKIPPING
  314.     SKIP_MESSAGE="glxinfo not installed"
  315.     ERROR_MESSAGE="The program glxinfo is needed to perform a number of crucial tests."
  316.     if [ -e /etc/debian_version ]; then
  317.     DIST_HELP="You need to install the package \033[1mmesa-utils\033[0m\n Type e.g. \033[1msudo apt-get install mesa-utils\033[0m to install it."
  318.     elif [ -e /etc/mandriva-release ]; then
  319.     DIST_HELP="You need to install \033[1mmesa-demos\033[0m\n"
  320.     fi
  321.     return 0
  322.   fi
  323.  
  324.   if [ $(glxinfo 2>/dev/null | grep GLX_EXT_texture_from_pixmap -c) -gt 2 ]; then
  325.     TFP=$OK
  326.   elif [ $(LIBGL_ALWAYS_INDIRECT=1 glxinfo 2>/dev/null | grep GLX_EXT_texture_from_pixmap -c) -gt 2 ]; then
  327.     TFP=$OK
  328.   else
  329.     TFP=$FAIL
  330.   fi
  331. }
  332.  
  333. # Check for non power of two texture support
  334. check_npo2()
  335. {
  336.   if [ "$RENDER" = Xgl ] || [ -z $GLXINFO ]; then
  337.     NPO2=$SKIPPING
  338.   elif glxinfo 2>/dev/null | egrep -q '(GL_ARB_texture_non_power_of_two|GL_NV_texture_rectangle|GL_EXT_texture_rectangle|GL_ARB_texture_rectangle)' ; then
  339.     NPO2=$OK
  340.   else
  341.     NPO2=$FAIL
  342.   fi
  343. }
  344.  
  345. # Check for composite extension
  346. check_composite()
  347. {
  348.   if xdpyinfo -queryExtensions | grep -q Composite ; then
  349.     COMP=$OK
  350.   else
  351.     COMP=$FAIL
  352.   fi
  353. }
  354.  
  355. # Check for FBConfig
  356. check_fbconfig()
  357. {
  358.   if [ -z $GLXINFO ]; then
  359.     FBC=$SKIPPING
  360.   elif glxinfo 2>/dev/null | grep -q GLX.*fbconfig ; then
  361.     FBC=$OK
  362.   elif [ "$DRV" = via ]; then
  363.     FBC=$SKIPPING # 'glxinfo -i' kills X on some setups using the via driver
  364.   elif glxinfo -i 2>/dev/null | grep -q GLX.*fbconfig ; then
  365.     FBC=$OK
  366.   else
  367.     FBC=$FAIL
  368.   fi
  369. }
  370.  
  371. # Check if fglrx driver supports composite
  372. check_fglrx()
  373. {
  374.   if [ "$DRV" = fglrx ]; then
  375.     FGLRXINFO=$(command -v fglrxinfo)
  376.     if [ ! -z "$FGLRXINFO" ]; then
  377.       if $FGLRXINFO | grep -q mesa ; then
  378.         STATUS=$FAIL
  379.         ERROR="Fglrx driver not properly installed, you are using the Mesa driver."
  380.         return 0
  381.       else
  382.         DIGITS=$($FGLRXINFO | grep version | sed 's/[a-Z:(.)]//g')
  383.         for i in $DIGITS ; do
  384.           if [ $i -gt 100000 ]; then
  385.             FGLRX_VERSION=$i
  386.           fi
  387.         done
  388.         FGLRX_COMPOSITE=206958 # 2.0.6958 first release to support AIGLX
  389.         if [ ! -z $FGLRX_VERSION ]; then
  390.           if [ $FGLRX_VERSION -lt $FGLRX_COMPOSITE ] && [ "$RENDER" != Xgl ]; then
  391.             STATUS=$FAIL
  392.             ERROR="The version of fglrx in use needs Xgl to work with Compiz."
  393.             ERROR_MESSAGE="Older versions of fglrx do not support AIGLX, so you have to use Xgl in order\n to make Compiz run with this driver.\n You can either install Xgl or a newer version of the fglrx driver."
  394.             if [ "$DISTRIB_ID" = Ubuntu ]; then
  395.               if [ $(echo "$DISTRIB_RELEASE" | sed 's/\.//g') -gt 704 ]; then
  396.                 DIST_HELP="Type \033[1msudo apt-get install xserver-xgl\033[0m to install Xgl."
  397.               fi
  398.             fi
  399.             return 0
  400.           fi
  401.           return 1
  402.         fi
  403.         STATUS=$SKIPPING
  404.         SKIP_MESSAGE="Unable to detect fglrx driver version in use."
  405.         return 0
  406.       fi
  407.     fi
  408.     STATUS=$FAIL
  409.     ERROR="Fglrx driver not properly installed. Could not run fglrxinfo."
  410.     return 0
  411.   fi
  412.   
  413.   return 1
  414. }
  415.  
  416. if [ -z $XDG_CONFIG_DIRS ]; then
  417.   XDG_CONFIG_DIRS=/etc/xdg
  418. fi
  419.  
  420. if [ -z $XDG_CONFIG_HOME ]; then
  421.   XDG_CONFIG_HOME=$HOME/.config
  422. fi
  423.  
  424. COMPIZ_MNGR_HOME=$XDG_CONFIG_HOME/compiz/compiz-manager
  425.  
  426. # Check if checks are skipped (by compiz-manager, not here!)
  427. check_skip()
  428. {
  429.   OLD_IFS=$IFS
  430.   IFS=:
  431.   for m in $XDG_CONFIG_DIRS
  432.   do
  433.     test -r $m/compiz/compiz-manager && . $m/compiz/compiz-manager
  434.   done
  435.   IFS=$OLD_IFS
  436.   unset OLD_IFS
  437.  
  438.   if [ -r $COMPIZ_MNGR_HOME ]; then
  439.     . $COMPIZ_MNGR_HOME
  440.   fi
  441.  
  442.   if [ "$SKIP_CHECKS" = yes ]; then
  443.     return 1
  444.   fi
  445.   
  446.   return 0
  447. }
  448.  
  449. # Check max texture size compared to resolution in use
  450. check_resolution()
  451. {
  452.   if [ -z $GLXINFO ]; then
  453.     STATUS=$SKIPPING
  454.     return 0
  455.   fi
  456.  
  457.   TEXTURE_LIMIT=$(glxinfo -l 2>/dev/null | grep GL_MAX_TEXTURE_SIZE | sed 's/.*=[^0-9]//g')
  458.   RESOLUTION=$(xdpyinfo | grep -i dimensions: | sed 's/[^0-9]*pixels.*(.*).*//' | sed 's/[^0-9x]*//')
  459.   VRES=$(echo $RESOLUTION | sed 's/.*x//')
  460.   HRES=$(echo $RESOLUTION | sed 's/x.*//')
  461.  
  462.   if [ -z $TEXTURE_LIMIT ]; then
  463.     STATUS=$SKIPPING
  464.     SKIP_MESSAGE="Unable to detect maximum 3D texture size"
  465.     return 0
  466.   elif [ $VRES -gt $TEXTURE_LIMIT ] || [ $HRES -gt $TEXTURE_LIMIT ]; then
  467.     STATUS=$FAIL
  468.     ERROR="Your current resolution is too high to run Compiz."
  469.     ERROR_MESSAGE="Your resolution is \033[1m${RESOLUTION}\033[0m but the maximum 3D texture size that your\n graphics card is capable of is \033[1m${TEXTURE_LIMIT}x${TEXTURE_LIMIT}\033[0m. Thus Compiz will not be able to run\n on this setup. You have to decrease the resolution first (in case you are\n using a dual-head setup, try disabling one monitor and run the script again)."
  470.     return 0
  471.   fi
  472.   
  473.   return 1
  474. }
  475.  
  476.  
  477. # Check if there is already another compositing manager running 
  478. check_compositor()
  479. {
  480.   XCOMPMGR_PID=$(ps -o pid= -C xcompmgr)
  481.   METACITY_PID=$(ps -o pid= -C metacity)
  482.   XFWM_PID=$(ps -o pid= -C xfwm4)
  483.  
  484.   if [ ! -z $XCOMPMGR_PID ]; then
  485.     OTHER_COMP=true
  486.     COMP_MSG="It has been detected, that you are currently running \033[1mxcompmgr\033[0m, which is a\n standalone compositing manager."
  487.     QUERY_XCOMPMGR=yes
  488.   elif [ ! -z $METACITY_PID ]; then
  489.     METACITY=$(command -v metacity)
  490.     if [ ! -z $METACITY ]; then
  491.       if [ $($METACITY --version | grep metacity | awk '{print $2}' | sed 's/\.//g') -gt 2200 ]; then
  492.         GCONFTOOL=$(command -v gconftool-2)
  493.         if [ ! -z $GCONFTOOL ]; then
  494.           if $GCONFTOOL -a /apps/metacity/general | grep -q compositing_manager &&
  495.              [ "$($GCONFTOOL -g /apps/metacity/general/compositing_manager)" = true ]; then
  496.             OTHER_COMP=true
  497.             WM_COMP=GNOME
  498.             QUERY_METACITY=yes
  499.           fi
  500.         fi
  501.       fi
  502.     fi
  503.   elif [ ! -z $XFWM_PID ]; then
  504.     if [ -r $XDG_CONFIG_HOME/xfce4/mcs_settings/wmtweaks.xml ]; then
  505.       if grep UseCompositing $XDG_CONFIG_HOME/xfce4/mcs_settings/wmtweaks.xml | grep -q 'value="1"' &&
  506.         ! ps -ef | grep xfwm4 | grep -q compositor=off ; then
  507.         OTHER_COMP=true
  508.         WM_COMP=Xfce
  509.         QUERY_XFWM=yes
  510.       fi
  511.     fi
  512.   fi
  513.  
  514.   if [ ! -z $OTHER_COMP ]; then
  515.     ERROR="Another compositing manager in use."
  516.     if [ ! -z $WM_COMP ]; then
  517.       COMP_MSG="The default window manager of $WM_COMP has its own compositing manager to\n provide basic desktop effects."
  518.     fi
  519.     ERROR_MESSAGE="${COMP_MSG}\n If this one is in use, Compiz will not be able to run."
  520.     return 0
  521.   fi
  522.  
  523.   return 1
  524. }
  525.  
  526. # Hardy blacklists laptops using ati/radeon driver (LP#201330)
  527. check_laptop_ati()
  528. {
  529.   if [ "$DISTRIB_ID $DISTRIB_RELEASE" = "Ubuntu 8.04" ]; then
  530.     if [ "$DRV" = ati ] || [ "$DRV" = radeon ] ; then
  531.       if laptop-detect && check_skip ; then
  532.         ERROR="Laptop using $DRV driver."
  533.         ERROR_MESSAGE="It has been detected, that you are running a laptop with an ATI chip.\n The $DRV driver supports Compiz out-of-the-box but because of a nasty bug\n in the driver that causes X to freeze on some cards, this particular\n combination had to be blacklisted in Ubuntu \"Hardy Heron\".\n\n In case you already used Compiz successfully on Ubuntu 7.10 (Gutsy), it is\n safe to skip the blacklist."
  534.         QUERY_SKIP=yes
  535.         return 0
  536.       fi
  537.     fi
  538.   fi
  539.   
  540.   return 1
  541. }
  542.  
  543. # Check if "Composite" has been disabled in the xorg.conf
  544. check_cmpst_xorg()
  545. {
  546.   if [ "$COMP" = "$OK" ]; then
  547.     return 1
  548.   fi
  549.  
  550.   # Detect location of the Xorg log file
  551.   if [ ! -z $XSET ]; then
  552.     XORG_CONF=$($XSET q | grep "Config file" | awk '{print $3}')
  553.   fi
  554.   
  555.   # Fallback xorg.conf
  556.   if [ -z $XORG_CONF ]; then
  557.     if [ -f /etc/X11/xorg.conf ]; then
  558.       XORG_CONF=/etc/X11/xorg.conf
  559.     else
  560.       return 1
  561.     fi
  562.   fi
  563.  
  564.   if [ ! -r $XORG_CONF ]; then
  565.     SKIP_MESSAGE="No permission to read $XORG_CONF"
  566.     return 1
  567.   else
  568.     CMPST=$(grep -i "Composite" $XORG_CONF)
  569.     if echo $CMPST | grep -qi "0" ; then
  570.       COMPST_STAT='"0"'
  571.       COMPST_FIX='"1"'
  572.     elif echo $CMPST | grep -qi "Disable" ; then
  573.       COMPST_STAT='"Disable"'
  574.       COMPST_FIX='"Enable"'
  575.     elif echo $CMPST | grep -qi "false" ; then
  576.       COMPST_STAT='"false"'
  577.       COMPST_FIX='"true"'
  578.     fi
  579.   fi
  580.  
  581.   case $DE in
  582.     GNOME)
  583.       EDITOR=gedit
  584.       ;;
  585.     KDE4 | KDE)
  586.       EDITOR=kate
  587.       ;;
  588.     Xfce)
  589.       EDITOR=mousepad
  590.       ;;
  591.   esac
  592.  
  593.   if [ ! -z $COMPST_STAT ]; then
  594.     ERROR="Composite manually disabled"
  595.     ERROR_MESSAGE="It has been detected that the \"Composite\" option of your ${XORG_CONF}\n has been set to $COMPST_STAT"
  596.     if [ "$DRV" = fglrx ] && [ $FGLRX_VERSION -lt $FGLRX_COMPOSITE ]; then
  597.       return 0
  598.     fi
  599.     if [ ! -z $EDITOR ] && [ -x $EDITOR ]; then
  600.         DIST_HELP="Open the file being root, e.g. \033[1msudo $EDITOR $XORG_CONF\033[0m\n Then change $COMPST_STAT to $COMPST_FIX and save. Finally restart X and try again."
  601.     else
  602.       DIST_HELP="Open the file being root and change $COMPST_STAT to $COMPST_FIX\n Then restart X and try again."
  603.     fi
  604.     return 0
  605.   fi
  606.  
  607.   return 1
  608. }
  609.  
  610. # Check for Software Rasterizer
  611. check_rasterizer()
  612. {
  613.   if glxinfo 2>/dev/null | grep -q 'OpenGL renderer string: Software Rasterizer' ; then
  614.     ERROR="Software Rasterizer in use"  #TODO add $ERROR_MESSAGE
  615.     return 0
  616.   else
  617.     return 1
  618.   fi
  619. }
  620.  
  621. DISCLAIMER="You can skip this blacklist -- but keep in mind that you did so.\n Do not complain if you encounter any problems with Compiz afterwards."
  622.  
  623. # Check if driver in use is on the whitelist
  624. check_whitelist()
  625. {
  626.   for i in $WHITELIST ; do
  627.     if [ "$DRV" = "$i" ]; then
  628.       return 1
  629.     fi
  630.   done
  631.  
  632.   if [ "$DRV" = "$UNKNOWN" ]; then
  633.     DRV_MSG="Unknown driver in use."
  634.   else
  635.     DRV_MSG="Detected driver is not on the whitelist."
  636.   fi
  637.  
  638.   if [ "$TFP" = "$OK" -o "$SKIPPING" ] && [ "$NPO2" = "$OK" -o "$SKIPPING" ] &&
  639.      [ "$COMP" = "$OK" ] && [ "$FBC" = "$OK" -o "$SKIPPING" ]; then
  640.     if ! check_skip ; then
  641.       return 1
  642.     fi
  643.     STATUS=$WARN
  644.     WARNING=$DRV_MSG
  645.     ERROR_MESSAGE="Your driver is not widely known to work with Compiz and thus may be\n blacklisted on certain distributions.\n\n $DISCLAIMER"
  646.     QUERY_SKIP=yes
  647.     return 0
  648.   elif [ "$DRV" = vmware ] || [ "$DRV" = vboxvideo ]; then
  649.     STATUS=$FAIL
  650.     ERROR="$DRV driver in use"
  651.     ERROR_MESSAGE="Compiz can not be run in a virtual environment."
  652.     return 0
  653.   fi
  654.  
  655.   STATUS=$FAIL
  656.   ERROR=$DRV_MSG
  657.   ERROR_MESSAGE="Your driver is not known (most probably not able) to work with Compiz.\n See http://wiki.compiz-fusion.org/Hardware for details."
  658.  
  659.   if [ "$DISTRIB_ID" = Ubuntu ]; then
  660.     detect_driver_manager
  661.   fi
  662.   
  663.   return 0
  664. }
  665.  
  666. # PCI IDs that may be blacklist on certain distributions
  667. # List taken from Gutsy
  668. GUTSY_BLACKLIST="1002:5954 1002:5854 1002:5955 1002:4153 8086:2982 8086:2992
  669.                  8086:29a2 8086:2a02 8086:2a12 8086:2972 1002:3152 1002:3150
  670.                  1002:5462 1002:5653"
  671. # Blacklisted IDs on Intrepid
  672. BLACKLISTED_PCIIDS="$GUTSY_BLACKLIST 8086:1132 8086:2e02 8086:3577 8086:2562"
  673.  
  674. # My own private PCI IDs (added for testing reasons)
  675. # Please let me know if I really was that stupid to let those in here.
  676. #BLACKLISTED_PCIIDS="$BLACKLISTED_PCIIDS 1002:4152 1002:4e50"
  677.  
  678. # Check if PCI ID in use is on the blacklist
  679. check_pciid()
  680. {
  681.   if [ "$DISTRIB_ID" = Ubuntu ] && [ "$DISTRIB_RELEASE" = "8.04" ]; then
  682.     return 1
  683.   fi
  684.  
  685.   for PCIID in $BLACKLISTED_PCIIDS ; do
  686.     if $(lspci -n | grep -q "$PCIID") && check_skip ; then
  687.       STATUS=$WARN
  688.       WARNING="PCI ID \033[1m${PCIID}\033[0m detected."
  689.       ERROR_MESSAGE="Your particular graphics chip may be blacklisted on certain distributions.\n However that does not necessarily mean you will not be able to run Compiz.\n\n $DISCLAIMER"
  690.       QUERY_SKIP=yes
  691.       return 0
  692.     fi
  693.   done
  694.   
  695.   return 1
  696. }
  697.  
  698. # Check for needed xdg files in Ubuntu
  699. check_xdg()
  700. {
  701.   if [ "$DISTRIB_ID" = Ubuntu ]; then
  702.     if [ $(echo "$DISTRIB_RELEASE" | sed 's/\.//g') -gt 704 ]; then
  703.       XDG_COMPIZ=/etc/xdg/compiz
  704.       if [ ! -e $XDG_COMPIZ/compiz-manager ] && [ -e /usr/bin/compiz.real ]; then
  705.         check_skip
  706.         if [ "$COMPIZ_BIN_PATH" = /usr/bin/ ] && [ "$COMPIZ_NAME" = compiz.real ] &&
  707.            [ "$PLUGIN_PATH" = /usr/lib/compiz/ ]; then
  708.           return 1
  709.         else
  710.           STATUS=$WARN
  711.           WARNING="No path to Compiz found."
  712.           ERROR_MESSAGE="In case you did not compile Compiz manually, this will result in Compiz\n failing to run."
  713.           if [ -d $XDG_COMPIZ ]; then
  714.             BACKUP=$(echo $(ls $XDG_COMPIZ | grep "compiz-manager\.") | awk '{print $1}')
  715.           fi
  716.           if [ ! -z $BACKUP ] ; then
  717.             DIST_HELP="You can try to fix this, by typing the following command in the terminal:\n\033[1msudo mv $XDG_COMPIZ/$BACKUP $XDG_COMPIZ/compiz-manager\033[0m"
  718.           fi
  719.           return 0
  720.         fi
  721.       fi
  722.     fi
  723.   fi
  724.  
  725.   return 1
  726. }
  727.  
  728. # Check if Nvidia card in use has enough memory
  729. check_nvidia_mem()
  730. {
  731.   if [ "$DRV" = nvidia ]; then
  732.     if [ "$RENDER" = Xgl ]; then
  733.       STATUS=$SKIPPING
  734.       SKIP_MESSAGE="Xgl on Nvidia chip."
  735.       return 0
  736.     fi
  737.     NVIDIA_SETTINGS=$(command -v nvidia-settings)
  738.     if [ ! -z $NVIDIA_SETTINGS ] ; then
  739.       MEM=$($NVIDIA_SETTINGS -q VideoRam | egrep Attribute\ \'VideoRam\'\ .*: | cut -d: -f3 | sed 's/[^0-9]//g')
  740.       NVIDIA_MEMORY=65536 # 64MB
  741.       if [ "$MEM" -lt $NVIDIA_MEMORY ] && check_skip ; then
  742.         STATUS=$WARN
  743.         WARNING="Nvidia card has not enough memory ($MEM KB) to run Compiz properly."
  744.         ERROR_MESSAGE="It is not recommended to run Compiz on a Nvidia chip with such a low amount\n of memory. Because of that, your hardware may be blacklisted on certain\n distributions.\n\n $DISCLAIMER"
  745.         QUERY_SKIP=yes
  746.         return 0
  747.       fi
  748.       return 1
  749.     fi
  750.     STATUS=$SKIPPING
  751.     SKIP_MESSAGE="Could not check the amount of memory on your Nvidia chip."
  752.     ERROR_MESSAGE="That does \033[1mnot\033[0m mean, you will not be able to use Compiz.\n If everything else went OK you are most probably fine.\n\n In case you want the script to check this step as well, install the program\n \033[1mnvidia-settings\033[0m on your system."
  753.     return 0
  754.   fi
  755.   
  756.   return 1
  757. }
  758.  
  759. # Check for proprietary driver (Ubuntu only)
  760. check_prop_driver()
  761. {
  762.   printf "Check if there's an alternate (proprietary) driver available? (Y/n) "
  763.   read REPLY
  764.   case $REPLY in
  765.     "" | y | Y | yes | Yes)
  766.       case $DRVS_MNGR in 
  767.         hardy-gtk)
  768.           exec gksu jockey-gtk & exit 0
  769.           ;;
  770.         hardy-kde)
  771.           exec kdesu jockey-kde & exit 0
  772.           ;;
  773.         gutsy-gtk)
  774.           exec gksu restricted-manager & exit 0
  775.           ;;
  776.         gutsy-kde)
  777.           exec kdesu resrticted-manager-kde & exit 0
  778.           ;;
  779.         feisty-gtk)
  780.           exec gksu restricted-manager & exit 0
  781.           ;;
  782.       esac
  783.       ;;
  784.       n | N | no | No)
  785.       exit 0
  786.       ;;
  787.     *)
  788.       check_prop_driver
  789.       ;;
  790.   esac
  791. }
  792.  
  793. # Query if the user wants to skip checks in compiz-manager
  794. query_skip_checks()
  795. {
  796.   printf "Do you want to skip blacklist checks by Compiz? (y/N) "
  797.   read REPLY
  798.   case $REPLY in
  799.     y | Y | yes | Yes)
  800.       mkdir -p $XDG_CONFIG_HOME/compiz
  801.       echo SKIP_CHECKS=yes >> $COMPIZ_MNGR_HOME
  802.       ;;
  803.     "" | n | N | no | No)
  804.       exit 0
  805.       ;;
  806.     *)
  807.       query_skip_checks
  808.       ;;
  809.   esac
  810. }
  811.  
  812. # Query if the user wants to kill xcompmgr
  813. query_xcompmgr()
  814. {
  815.   printf "Do you want to disable xcompmgr? (Y/n) "
  816.   read REPLY
  817.   case $REPLY in
  818.     "" | y | Y | yes | Yes)
  819.       kill $XCOMPMGR_PID
  820.       ;;
  821.       n | N | no | No)
  822.       exit 0
  823.       ;;
  824.     *)
  825.       query_xcompmgr
  826.       ;;
  827.   esac
  828. }
  829.  
  830. # Query to disable Metacity's compositing manager
  831. query_metacity_comp()
  832. {
  833.   printf "Do you want to disable GNOME's compositing manager? (Y/n) "
  834.   read REPLY
  835.   case $REPLY in
  836.     "" | y | Y | yes | Yes)
  837.       $GCONFTOOL -s -t bool /apps/metacity/general/compositing_manager false
  838.       kill -9 $METACITY_PID 2>/dev/null
  839.       exec $METACITY --replace &
  840.       ;;
  841.       n | N | no | No)
  842.       exit 0
  843.       ;;
  844.     *)
  845.       query_metacity_comp
  846.       ;;
  847.   esac
  848. }
  849.  
  850. # Query if the user wants to disable Xfwm's compsitor
  851. query_xfwm_comp()
  852. {
  853.   printf "Do you want to disable Xfce's compositing manager? (Y/n) "
  854.   read REPLY
  855.   case $REPLY in
  856.     "" | y | Y | yes | Yes)
  857.       kill $XFWM_PID
  858.       sleep 1
  859.       exec xfwm4 --compositor=off --daemon &
  860.       exit 0
  861.       ;;
  862.       n | N | no | No)
  863.       exit 0
  864.       ;;
  865.     *)
  866.       query_xfwm_comp
  867.       ;;
  868.   esac
  869. }
  870.  
  871. # Ask user to print additional info (Starship Troopers style).
  872. more_info()
  873. {
  874.   printf "Would you like to know more? (Y/n) "
  875.   read REPLY
  876.   case $REPLY in
  877.     "" | y | Y | yes | Yes)
  878.       return 0
  879.       ;;
  880.     n | N | no | No)
  881.       return 1
  882.       ;;
  883.     *)
  884.       more_info
  885.       ;;
  886.   esac
  887. }
  888.  
  889. # --- Output starts here ---
  890.  
  891. # System info
  892. printf "\nGathering information about your system...\n\n"
  893. detect_distro
  894. printf " Distribution: %9s\033[1m${DISTRIB_ID} ${DISTRIB_RELEASE}\033[0m\n"
  895. detect_de
  896. printf " Desktop environment: %2s\033[1m${DE}\033[0m\n"
  897. detect_video
  898. printf " Graphics chip: %8s\033[1m${VIDEO}\033[0m\n"
  899. detect_driver
  900. printf " Driver in use: %8s\033[1m${DRV}\033[0m\n"
  901. detect_rendering
  902. printf " Rendering method: %5s\033[1m${RENDER}\033[0m\n"
  903.  
  904. # System checks
  905. printf "\nChecking if it's possible to run Compiz on your system..."
  906. if [ "$CHECKS" = yes ]; then
  907.   printf "%2s[${SKIPPING}]\n\n"
  908. else
  909.   printf "\n\n Checking for texture_from_pixmap..."
  910.   check_tfp
  911.   printf "%15s[${TFP}]\n"
  912.   printf " Checking for non power of two support..."
  913.   check_npo2
  914.   printf "%10s[${NPO2}]\n"
  915.   printf " Checking for composite extension..."
  916.   check_composite
  917.   printf "%15s[${COMP}]\n"
  918.   printf " Checking for FBConfig..."
  919.   check_fbconfig
  920.   printf "%26s[${FBC}]\n"
  921. fi
  922.  
  923. # Hardware checks
  924. printf " Checking for hardware/setup problems..."
  925. if [ "$CHECKS" = yes ]; then
  926.   printf "%11s[${SKIPPING}]\n\n"
  927. elif check_compositor || check_laptop_ati || check_cmpst_xorg || check_rasterizer ; then
  928.   printf "%11s[${FAIL}]\n\n"
  929. elif check_fglrx || check_whitelist || check_resolution || check_xdg || check_pciid || check_nvidia_mem ; then
  930.   printf "%11s[${STATUS}]\n\n"
  931. else
  932.   printf "%11s[${OK}]\n\n"
  933. fi
  934.  
  935. # Print error or warning (if any)
  936. # The $ERROR, $WARNING and $SKIP_MESSAGE outputs are supposed to be a
  937. # short description of the respective error.
  938. if [ "x$ERROR" != "x" ]; then
  939.   printf "There has been (at least) one error detected with your setup:\n \033[31mError:\033[0m $ERROR \n\n"
  940. elif [ "x$WARNING" != "x" ]; then
  941.   printf "Something potential problematic has been detected with your setup:\n \033[33mWarning:\033[0m $WARNING \n\n"
  942. elif [ "x$SKIP_MESSAGE" != "x" ]; then
  943.   printf "At least one check had to be skipped:\n \033[33mError:\033[0m $SKIP_MESSAGE \n\n"
  944. fi
  945.  
  946. # Interactive output begins here
  947. if [ "x$ERROR_MESSAGE" != "x" ] && more_info ; then
  948.   printf "\n $ERROR_MESSAGE \n\n"
  949.   if [ ! -z $QUERY_SKIP ]; then
  950.     query_skip_checks
  951.   elif [ ! -z $QUERY_XCOMPMGR ]; then
  952.     query_xcompmgr
  953.   elif [ ! -z $QUERY_METACITY ]; then
  954.     query_metacity_comp
  955.   elif [ ! -z $QUERY_XFWM ]; then
  956.     query_xfwm_comp
  957.   elif [ "x$DRVS_MNGR" != "x" ]; then
  958.     check_prop_driver
  959.   elif [ "x$DIST_HELP" != "x" ]; then
  960.     printf " $DIST_HELP \n\n"
  961.   fi
  962. fi
  963.  
  964. # If there was an error, return an error code
  965. if [ "x$ERROR" != "x" ]; then
  966.     exit 1
  967. fi
  968. exit 0
  969.